package healthchecker

import "sync"

type Hinterface interface {
	GetServers() []Server
}

var (
	setting config   //健康检查配置
	H       Reviewer //检查者 对外暴露
)

type conf struct {
	NetWork         string `json:"net_work" toml:"net_work"`               //协议
	Cycle           int    `json:"cycle" toml:"cycle"`                     //检查周期 秒
	Interval        int    `json:"interval" toml:"interval"`               //检查间隔 毫秒
	State           bool   `json:"state" toml:"state"`                     //true 开启 false  关闭
	DeathThreshold  int    `json:"deathThreshold" toml:"deathThreshold"`   //阈值 一个周期达到错误次数后判为失效服务器
	Timeout         int    `json:"timeout" toml:"timeout"`                 //超时时间 毫秒
	ReviveThreshold int    `json:"reviveThreshold" toml:"reviveThreshold"` //服务复活阈值
}

//检查记录
type Record struct {
	Success      int       //成功数
	Fail         int       //失败次数
	FailRatio    int       //失败占比
	SuccessRatio int       //成功占比
	FailInfo     []Failure //失败信息记录
	ServerInfo   Server    //上游服务器信息
}

//失败信息记录
type Failure struct {
	Addr string //服务器地址
	time int64  //时间点 记录请求时间戳
	Err  error  //错误信息
}

//服务器信息
type Server struct {
	NewWork      string      //协议
	Addr         string      //地址
	OriginalData interface{} //原始传参数据
	GroupIndex   int
	index        int //对应周期
}

type BackChan struct {
	Type     int         //0 死亡 1复活
	UpStream interface{} //上游服务器信息
}

//检查者
type Reviewer struct {
	Hresult     chan BackChan       //消息通道
	CheckRecord []map[string]Record //健康检查历史记录
	servers     []Server            //正常的服务器信息
	dieServers  map[string]Server   //死亡失效的服务器信息
	config      conf                //配置信息
	l           sync.Mutex
}

type config struct {
	Config conf `json:"config" toml:"config"`
}
